import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;

/**
 * Java虚引用:优先级最低
 * <p>
 * 当一个对象被垃圾回收的时候,如果其存在虚引用,则该引用会被放入引用队列
 * <p>
 * 特点:当内存不足时会被回收
 * <p>
 * 作用:因为finalize方法的不确定性,可以过来更加准确的判断一个对象是否已经被垃圾回收
 *
 * @author <a href="mailto:wengyj@59store.com">翁英健</a>
 * @version 1.1 16/4/3
 * @since 1.1
 */
public class PhantomReferenceDemo {


    /**
     * 回收之前:引用元素:=null
     * 回收之前:队列元素:=null
     * 回收之前:引用元素:=null
     * 回收之前:队列元素:=java.lang.ref.PhantomReference@266474c2
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {

        Object o = new Object();
        System.out.println(o);
        //引用队列
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> phantomReference = new PhantomReference<>(o, referenceQueue);

        System.out.println("回收之前:引用元素:=" + phantomReference.get());
        System.out.println("回收之前:队列元素:=" + referenceQueue.poll());

        o = null;
        System.gc();
        Thread.sleep(1000);

        System.out.println("回收之前:引用元素:=" + phantomReference.get());
        System.out.println("回收之前:队列元素:=" + referenceQueue.poll());
    }
}
